package com.common.msg.service;

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.common.core.domain.entity.SysUser;
import com.common.core.domain.model.LoginUser;
import com.common.core.page.PageDomain;
import com.common.msg.entity.*;
import com.common.msg.mapper.SysMessageAllreceiveMapper;
import com.common.msg.mapper.SysMessageMapper;
import com.common.msg.mapper.SysMessageRuleMapper;
import com.common.utils.SecurityUtils;
import com.common.utils.uuid.IdUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.apache.commons.text.StringSubstitutor;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class SysMessageService {
    @Autowired
    SysMessageMapper sysMessageMapper;

    @Autowired
    SysMessageRuleMapper sysMessageRuleMapper;

    @Autowired
    SysMessageAllreceiveMapper sysMessageAllreceiveMapper;

    public CutPageBean<SysMessageBo> sysMessageList(SysMessageVo sysMessageVo) {
        sysMessageVo.setStart(sysMessageVo.getPage(),sysMessageVo.getPageSize());
        CutPageBean<SysMessageBo> cutPage = new CutPageBean<>();
        List<SysMessageBo> list = sysMessageMapper.sysMessageList(sysMessageVo);
        int count = sysMessageMapper.sysMessageCount(sysMessageVo);
        cutPage.initCutPage(count,sysMessageVo.getPageSize(),list);
        return cutPage;
    }

    public  int insertSysMessage(SysMessageBo sysMessageBo) {
        sysMessageBo.setId(IdUtils.simpleUUID());
        Date date = new Date();
        SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sysMessageBo.setSendTime(dateFormat.format(date));
        int row=sysMessageMapper.insert(sysMessageBo);
        return row;
    }

    public int updateSysMessage(SysMessageBo sysMessageBo) {
        SysMessageVo sysMessageVo=new SysMessageVo();
        sysMessageVo.setId(sysMessageBo.getId());
        SysMessageBo list =sysMessageMapper.sysMessage(sysMessageVo);
        String isRead=list.getIsRead();
        if(isRead.equals("0")){
            LoginUser loginUser = SecurityUtils.getLoginUser();
            SysUser user = loginUser.getUser();
            SysMessageAllreceiveBo sysMessageAllreceiveBo=new SysMessageAllreceiveBo();
            sysMessageAllreceiveBo.setMessageId(sysMessageBo.getId());
            sysMessageAllreceiveBo.setId(IdUtils.simpleUUID());
            sysMessageAllreceiveBo.setIsRead("1");
            sysMessageAllreceiveBo.setPersonId(user.getUserId().toString());
            Date date = new Date();
            SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            sysMessageAllreceiveBo.setReadDate(dateFormat.format(date));
            int row=sysMessageAllreceiveMapper.insert(sysMessageAllreceiveBo);
            return row;
        }else {
            sysMessageBo.setIsRead("1");
            int row=sysMessageMapper.update(sysMessageBo,new UpdateWrapper<SysMessageBo>().eq("ID",sysMessageBo.getId()));
            return row;
        }
    }

    public int updateAllRead() {
        Long userId = SecurityUtils.getLoginUser().getUser().getUserId();
        SysMessageVo sysMessageVo=new SysMessageVo();
        sysMessageVo.setId(String.valueOf(userId));
        List<SysMessageBo> list = sysMessageMapper.unreadSysMessage(sysMessageVo);
        int row =0;
        for (int i=0;i<list.size();i++){
            SysMessageBo sysMessageBo=new SysMessageBo();
            sysMessageBo.setIsRead("1");
            row=sysMessageMapper.update(sysMessageBo,new UpdateWrapper<SysMessageBo>().eq("ID",list.get(i).getId()));
        }
        return row;
    }


    public List<SysMessageBo> unreadSysMessage(PageDomain pageDomain, SysMessageVo sysMessageVo) {
        List<SysMessageBo> list = sysMessageMapper.unreadSysMessage(sysMessageVo);
        return list;
    }

    public List<SysMessageBo> readSysMessage(PageDomain pageDomain, SysMessageVo sysMessageVo) {
        List<SysMessageBo> list = sysMessageMapper.readSysMessage(sysMessageVo);
        return list;
    }

    public  String replacePlaceholders(SysMsgRuleVo sysMsgRuleVo) {
        SysMsgRuleBo list = sysMessageRuleMapper.sysMessageRuleList(sysMsgRuleVo);
        String template=list.getTempContent();
        // 检查空值
        if (template == null) {
            throw new IllegalArgumentException("模板文本不能为null");
        }
        if (sysMsgRuleVo.getReplacements() == null) {
            throw new IllegalArgumentException("替换Map不能为null");
        }

        String result = template;

        // 遍历Map中的所有键值对
        for (Map.Entry<String, String> entry : sysMsgRuleVo.getReplacements().entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();

            // 检查value是否为null
            if (value == null) {
                throw new IllegalArgumentException("键 '" + key + "' 的值为null");
            }

            // 替换所有出现的 {key} 为对应的value
            String placeholder = "#" + key + "#";
            result = result.replace(placeholder, value);
        }

        return result;
    }
}
